using SDK.Scripts.Utils;
using System;

namespace SDK.Scripts.Network
{
	[Serializable]
	public class NetMsg
	{
		public const int PROXYMSG_HEAD_LEN = 16;

		public const int MSG_HEADER_LEN = 16;

		public ProxyMsg msgProxy;

		public MsgHead msgHead;

		public byte[] msgBody;

		public bool ObjectToBytes(ref byte[] bytes)
		{
			int num = 0;
			if (msgProxy != null)
			{
				bytes = new byte[msgProxy.mLen];
				byte[] bytes2 = new byte[16];
				if (!msgProxy.encodeHead(ref bytes2))
				{
					Debuger.LogError("porxy msg copy error");
					return false;
				}
				Array.Copy(bytes2, 0, bytes, num, 16);
				num += 16;
			}
			else
			{
				bytes = new byte[msgHead.mLen];
			}
			byte[] bytes3 = new byte[16];
			if (msgHead.encodeHead(ref bytes3))
			{
				Array.Copy(bytes3, 0, bytes, num, 16);
				num += 16;
				Array.Copy(msgBody, 0, bytes, num, msgBody.Length);
				return true;
			}
			Debuger.LogError("head msg copy error");
			return false;
		}

		public bool BytesToObject(bool isConnSvr, byte[] bytes, ref int offset, int len, out int ret)
		{
			ret = 1;
			ProxyMsg proxyMsg = new ProxyMsg();
			if (isConnSvr)
			{
				if (32 > len)
				{
					return false;
				}
				byte[] bytes2 = new byte[16];
				Array.Copy(bytes, offset, bytes2, 0, 16);
				offset += 16;
				if (!proxyMsg.decodeHead(ref bytes2))
				{
					ret = -1;
					return false;
				}
				if (proxyMsg.mLen > len)
				{
					return false;
				}
			}
			else
			{
				proxyMsg.mCmd = 0;
				proxyMsg.type = 0;
				if (16 > len)
				{
					return false;
				}
			}
			msgProxy = proxyMsg;
			byte[] bytes3 = new byte[16];
			Array.Copy(bytes, offset, bytes3, 0, 16);
			offset += 16;
			MsgHead msgHead = new MsgHead();
			if (msgHead.decodeHead(ref bytes3))
			{
				if (msgHead.mLen > len)
				{
					return false;
				}
				this.msgHead = msgHead;
				int num = this.msgHead.mLen - 16;
				if (num < 0)
				{
					ret = -1;
					return false;
				}
				msgBody = new byte[num];
				Array.Copy(bytes, offset, msgBody, 0, num);
				offset += num;
				return true;
			}
			ret = -1;
			return false;
		}
	}
}
